home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Burning & Media / MediaMan 3 / MediaMan3Setup.msi / disk1.cab / MediaMan_Help.chm / js / ieemu.js < prev    next >
Text File  |  2008-09-16  |  8KB  |  311 lines

  1. var ie = document.all != null;
  2. var moz = !ie && document.getElementById != null && document.layers == null;
  3.  
  4. /*
  5. if (moz) {    // set up ie environment for Moz
  6.  
  7.     extendEventObject();
  8.     //emulateAttachEvent();
  9.     //emulateFromToElement();
  10.     emulateEventHandlers(["click", "dblclick", "mouseover", "mouseout",
  11.                             "mousedown", "mouseup", "mousemove",
  12.                             "keydown", "keypress", "keyup"]);
  13.     emulateDocumentAll();
  14.     emulateElement()
  15.     emulateCurrentStyle(["left", "right", "top", "bottom", "width", "height"]);
  16.  
  17.     // Mozilla returns the wrong button number
  18.     Event.LEFT = 1;
  19.     Event.MIDDLE = 2;
  20.     Event.RIGHT = 3;
  21.     
  22.  
  23.     
  24. }
  25. else {
  26.     Event = {};
  27.     // IE is returning wrong button number as well :-)
  28.     Event.LEFT = 1;
  29.     Event.MIDDLE = 4;
  30.     Event.RIGHT = 2;
  31. }
  32. */
  33.  
  34.  
  35.  
  36. /*
  37.  * Extends the event object with srcElement, cancelBubble, returnValue,
  38.  * fromElement and toElement
  39.  */
  40. function extendEventObject() {
  41.     Event.prototype.__defineSetter__("returnValue", function (b) {
  42.         if (!b) this.preventDefault();
  43.     });
  44.     
  45.     Event.prototype.__defineSetter__("cancelBubble", function (b) {
  46.         if (b) this.stopPropagation();
  47.     });
  48.     
  49.     Event.prototype.__defineGetter__("srcElement", function () {
  50.         var node = this.target;
  51.         while (node.nodeType != 1) node = node.parentNode;
  52.         return node;
  53.     });
  54.  
  55.     Event.prototype.__defineGetter__("fromElement", function () {
  56.         var node;
  57.         if (this.type == "mouseover")
  58.             node = this.relatedTarget;
  59.         else if (this.type == "mouseout")
  60.             node = this.target;
  61.         if (!node) return;
  62.         while (node.nodeType != 1) node = node.parentNode;
  63.         return node;
  64.     });
  65.  
  66.     Event.prototype.__defineGetter__("toElement", function () {
  67.         var node;
  68.         if (this.type == "mouseout")
  69.             node = this.relatedTarget;
  70.         else if (this.type == "mouseover")
  71.             node = this.target;
  72.         if (!node) return;
  73.         while (node.nodeType != 1) node = node.parentNode;
  74.         return node;
  75.     });
  76.     
  77.     Event.prototype.__defineGetter__("offsetX", function () {
  78.         return this.layerX;
  79.     });
  80.     Event.prototype.__defineGetter__("offsetY", function () {
  81.         return this.layerY;
  82.     });
  83. }
  84.  
  85. /*
  86.  * Emulates element.attachEvent as well as detachEvent
  87.  */
  88. function emulateAttachEvent() {
  89.     window.attachEvent =
  90.     HTMLDocument.prototype.attachEvent = 
  91.     HTMLElement.prototype.attachEvent = function (sType, fHandler) {
  92.         var shortTypeName = sType.replace(/on/, "");
  93.         fHandler._ieEmuEventHandler = function (e) {
  94.             window.event = e;
  95.             return fHandler();
  96.         };
  97.         this.addEventListener(shortTypeName, fHandler._ieEmuEventHandler, false);
  98.     };
  99.  
  100.     window.detachEvent =
  101.     HTMLDocument.prototype.detachEvent = 
  102.     HTMLElement.prototype.detachEvent = function (sType, fHandler) {
  103.         var shortTypeName = sType.replace(/on/, "");
  104.         if (typeof fHandler._ieEmuEventHandler == "function")
  105.             this.removeEventListener(shortTypeName, fHandler._ieEmuEventHandler, false);
  106.         else
  107.             this.removeEventListener(shortTypeName, fHandler, true);
  108.     };
  109. }
  110.  
  111. /*
  112.  * This function binds the event object passed along in an
  113.  * event to window.event
  114.  */
  115. function emulateEventHandlers(eventNames) {
  116.     for (var i = 0; i < eventNames.length; i++) {    
  117.         document.addEventListener(eventNames[i], function (e) {
  118.             window.event = e;
  119.         }, true);    // using capture
  120.     }
  121. }
  122.  
  123. /*
  124.  * Simple emulation of document.all
  125.  * this one is far from complete. Be cautious
  126.  */
  127.  
  128. function emulateAllModel() {
  129.     var allGetter = function () {
  130.         var a = this.getElementsByTagName("*");
  131.         var node = this;
  132.         a.tags = function (sTagName) {
  133.             return node.getElementsByTagName(sTagName);
  134.         };
  135.         return a;
  136.     };
  137.     HTMLDocument.prototype.__defineGetter__("all", allGetter);
  138.     HTMLElement.prototype.__defineGetter__("all", allGetter);
  139. }
  140.  
  141. function extendElementModel() {
  142.     HTMLElement.prototype.__defineGetter__("parentElement", function () {
  143.         if (this.parentNode == this.ownerDocument) return null;
  144.         return this.parentNode;
  145.     });
  146.     
  147.     HTMLElement.prototype.__defineGetter__("children", function () {
  148.         var tmp = [];
  149.         var j = 0;
  150.         var n;
  151.         for (var i = 0; i < this.childNodes.length; i++) {
  152.             n = this.childNodes[i];
  153.             if (n.nodeType == 1) {
  154.                 tmp[j++] = n;
  155.                 if (n.name) {    // named children
  156.                     if (!tmp[n.name])
  157.                         tmp[n.name] = [];
  158.                     tmp[n.name][tmp[n.name].length] = n;
  159.                 }
  160.                 if (n.id)        // child with id
  161.                     tmp[n.id] = n
  162.             }
  163.         }
  164.         return tmp;
  165.     });
  166.     
  167.     HTMLElement.prototype.contains = function (oEl) {
  168.         if (oEl == this) return true;
  169.         if (oEl == null) return false;
  170.         return this.contains(oEl.parentNode);        
  171.     };
  172. }
  173.  
  174. /*
  175.  
  176. document.defaultView.getComputedStyle(el1,<BR>null).getPropertyValue('top');
  177.  
  178. */
  179. function emulateCurrentStyle(properties) {
  180.     HTMLElement.prototype.__defineGetter__("currentStyle", function () {
  181.         var cs = {};
  182.         var el = this;
  183.         for (var i = 0; i < properties.length; i++) {
  184.             //cs.__defineGetter__(properties[i], function () {
  185.             //    window.status = "i: " + i    ;
  186.             //    return document.defaultView.getComputedStyle(el, null).getPropertyValue(properties[i]);
  187.             //});
  188.             cs.__defineGetter__(properties[i], encapsulateObjects(el, properties[i]));
  189.         }
  190.         return cs;
  191.     });
  192. }
  193. // used internally for emualteCurrentStyle
  194. function encapsulateObjects(el, sProperty) {
  195.     return function () {
  196.         return document.defaultView.getComputedStyle(el, null).getPropertyValue(sProperty);
  197.     };
  198. }
  199.  
  200. function emulateHTMLModel() {
  201.  
  202.     // This function is used to generate a html string for the text properties/methods
  203.     // It replaces '\n' with "<BR"> as well as fixes consecutive white spaces
  204.     // It also repalaces some special characters    
  205.     function convertTextToHTML(s) {
  206.         s = s.replace(/\&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/\n/g, "<BR>");
  207.         while (/\s\s/.test(s))
  208.             s = s.replace(/\s\s/, "  ");
  209.         return s.replace(/\s/g, " ");
  210.     }
  211.  
  212.     HTMLElement.prototype.insertAdjacentHTML = function (sWhere, sHTML) {
  213.         var df;    // : DocumentFragment
  214.         var r = this.ownerDocument.createRange();
  215.         
  216.         switch (String(sWhere).toLowerCase()) {
  217.             case "beforebegin":
  218.                 r.setStartBefore(this);
  219.                 df = r.createContextualFragment(sHTML);
  220.                 this.parentNode.insertBefore(df, this);
  221.                 break;
  222.                 
  223.             case "afterbegin":
  224.                 r.selectNodeContents(this);
  225.                 r.collapse(true);
  226.                 df = r.createContextualFragment(sHTML);
  227.                 this.insertBefore(df, this.firstChild);
  228.                 break;
  229.                 
  230.             case "beforeend":
  231.                 r.selectNodeContents(this);
  232.                 r.collapse(false);
  233.                 df = r.createContextualFragment(sHTML);
  234.                 this.appendChild(df);
  235.                 break;
  236.                 
  237.             case "afterend":
  238.                 r.setStartAfter(this);
  239.                 df = r.createContextualFragment(sHTML);
  240.                 this.parentNode.insertBefore(df, this.nextSibling);
  241.                 break;
  242.         }    
  243.     };
  244.  
  245.     HTMLElement.prototype.__defineSetter__("outerHTML", function (sHTML) {
  246.        var r = this.ownerDocument.createRange();
  247.        r.setStartBefore(this);
  248.        var df = r.createContextualFragment(sHTML);
  249.        this.parentNode.replaceChild(df, this);
  250.        
  251.        return sHTML;
  252.     });
  253.  
  254.     HTMLElement.prototype.__defineGetter__("canHaveChildren", function () {
  255.         switch (this.tagName) {
  256.             case "AREA":
  257.             case "BASE":
  258.             case "BASEFONT":
  259.             case "COL":
  260.             case "FRAME":
  261.             case "HR":
  262.             case "IMG":
  263.             case "BR":
  264.             case "INPUT":
  265.             case "ISINDEX":
  266.             case "LINK":
  267.             case "META":
  268.             case "PARAM":
  269.                 return false;
  270.         }
  271.         return true;
  272.     });
  273.  
  274.     HTMLElement.prototype.__defineGetter__("outerHTML", function () {
  275.         var attr, attrs = this.attributes;
  276.         var str = "<" + this.tagName;
  277.         for (var i = 0; i < attrs.length; i++) {
  278.             attr = attrs[i];
  279.             if (attr.specified)
  280.                 str += " " + attr.name + '="' + attr.value + '"';
  281.         }
  282.         if (!this.canHaveChildren)
  283.             return str + ">";
  284.         
  285.         return str + ">" + this.innerHTML + "</" + this.tagName + ">";
  286.     });
  287.  
  288.  
  289.     HTMLElement.prototype.__defineSetter__("innerText", function (sText) {
  290.         this.innerHTML = convertTextToHTML(sText);
  291.         return sText;        
  292.     });
  293.  
  294.     var tmpGet;
  295.     HTMLElement.prototype.__defineGetter__("innerText", tmpGet = function () {
  296.         var r = this.ownerDocument.createRange();
  297.         r.selectNodeContents(this);
  298.         return r.toString();
  299.     });
  300.  
  301.     HTMLElement.prototype.__defineSetter__("outerText", function (sText) {
  302.         this.outerHTML = convertTextToHTML(sText);
  303.         return sText;
  304.     });
  305.     HTMLElement.prototype.__defineGetter__("outerText", tmpGet);
  306.  
  307.     HTMLElement.prototype.insertAdjacentText = function (sWhere, sText) {
  308.         this.insertAdjacentHTML(sWhere, convertTextToHTML(sText));
  309.     };
  310.  
  311. }